'''
函数就是一种封装(很多逻辑放到一起做成了一件事)
简化操作
为了复用
'''

#函数语法格式
# def 标识符([参数])
#    函数主体
#    [return]



def hello():
    print('hello')
    print('北京hello')
    #函数执行return时,直接结束函数
    return
    print('苏州hello')
    print('上海hello')
    #不返回时,默认有一个在最下面的return


def getOne():
    return 1
def getMany():
    #返回了一个值,并且组包成了一个元组
    return 1,2,3,4
def test():
    #函数体不能为空
    pass
def doubleNum(num,multiple):
    return num*multiple

def multNum(num,multiple = 2):
    return num*multiple

#不定长位置参数
def sumNum(*nums):

    #不定长参数,在函数中,是一个元组变量
    sum = 0
    for i in nums:
        sum+=i
    return sum
#不定长关键字
def my_print(**kwargs):
    # end = '\n', sep = "+"
    # a= 10,b = 20,c = 30
    #
    # print(type(**kwargs))

    #更多的是使用标识符,存的打包好的变量

    #标识符这个变量,存的1个字典
    # print(kwargs['a'])

    #放入的是逻辑**kwargs
    print(1,2,3,end = '\n',sep = "+")


#调用,将函数里的代码"黏贴到这个位置"

#调用时,考虑函数是否已经进入内存
print(hello())

#返回值,return其实返回一个值,
# 就看这个函数能不能作为一个需要的值去使用
# 作用: 增删查(return)改
# 看是否需要在这个函数中索取什么

print(getOne()+1)

#拆包
a,b,c,d = getMany()

print(a,b,c,d)
#交换也是基于拆包的
a,b = b,a
print(getMany())

#参数

#正常的参数,必须完全匹配,根据位置进行匹配的
print(doubleNum(3,2))

#根据关键字进行匹配,忽视顺序,数量还是必须匹配
print(doubleNum(multiple=10,num = 1))

#默认参数也是根据位置匹配,但实际默认值可以忽视,但是位置只能在位置参数的后面
print(multNum(10))

#想去忽略数量,可以对不常更改值,设定默认值
print(sumNum(1, 2, 3, 4, 5))

#不定长测试
my_print(end = '\n',sep = "+")

#1 位置参数  2默认参数 3关键字 4不定长位置参数  5不定长关键字参数

def test1(mu = 2,*num,a):
    pass
# test1(1,2,3,4,5,)

#函数通用问题,形参和实参
#函数内的变量不影响外部实参的变化
#内部的变量是一个局部的变量


def wb():
    a  =10
    changeA(a)

#全局变量和局部变量
a = 100
def changeA():

    #优先使用局部的
    #local--->edge(外部函数)---->global(全局)--->built-in(内置)
    #legb原则

    #声明外部变量
    global a
    a = 1000

changeA()

print(a)